package br.com.mackinvest.dao;

import static java.lang.System.out;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.TreeMap;

import br.com.mackinvest.constants.Constants;
import br.com.mackinvest.model.Acao;
import br.com.mackinvest.model.Fundo;
import br.com.mackinvest.model.Investimento;
import br.com.mackinvest.model.Poupanca;

public class InvestimentoMySQLDAO implements GenericDAO<Investimento> 
{
	private PreparedStatement statement;
	private String query;
	private Connection con;
	
	
	public InvestimentoMySQLDAO() {
		con = DBUtil.getConnection();
	}

	public void salva(Investimento model) 
	{
		query = "INSERT INTO tbInvestimentos(taxarendimento, saldo, descricao, tipo) VALUES (?,?,?,?)";
		try
		{
			statement = con.prepareStatement(query);
			statement.setFloat(1, model.getTaxaRendimento());			
			statement.setFloat(2, model.getSaldo());
			statement.setString(3, model.getDescricao());
			
			if ( model instanceof Poupanca )
				statement.setString(4, Constants.TIPO_INVESTIMENTO_POUPANCA);
			else if (  model instanceof Fundo )
				statement.setString(4, Constants.TIPO_INVESTIMENTO_FUNDO);
			else if (  model instanceof Acao )
				statement.setString(4, Constants.TIPO_INVESTIMENTO_ACAO);
			
			statement.executeUpdate();
		}
		catch(SQLException ex)
		{
			out.println(Constants.ERRO_INSERT_NAO_REALIZADO);
			out.println(ex);
		}	 
	}
	 
	public void deleta(Investimento model) {
		try
		{
			query = "DELETE FROM tbInvestimentos WHERE id=?";			
			statement = con.prepareStatement(query);
			statement.setInt(1, model.getId());
			statement.executeUpdate();
		}
		catch(SQLException ex)
		{
			out.println(Constants.ERRO_DELETE_NAO_REALIZADO);
			out.println(ex);
		}
	}
	 
	public void atualiza(Investimento model) {
		query = "UPDATE tbInvestimentos SET taxarendimento = ?, saldo = ?, descricao = ?, tipo = ? WHERE id = ?)";
		try
		{
			statement = con.prepareStatement(query);
			statement.setFloat(1, model.getTaxaRendimento());			
			statement.setFloat(2, model.getSaldo());
			statement.setString(3, model.getDescricao());
			
			if ( model instanceof Poupanca )
				statement.setString(4, Constants.TIPO_INVESTIMENTO_POUPANCA);
			else if (  model instanceof Fundo )
				statement.setString(4, Constants.TIPO_INVESTIMENTO_FUNDO);
			else if (  model instanceof Acao )
				statement.setString(4, Constants.TIPO_INVESTIMENTO_ACAO);
			
			statement.executeUpdate();
		}
		catch(SQLException ex)
		{
			out.println(Constants.ERRO_INSERT_NAO_REALIZADO);
			out.println(ex);
		}	 
	 
	}

 
	public TreeMap<Integer, Investimento> retornaTodos() {
		query = "SELECT * FROM tbInvestimentos ";
		TreeMap<Integer, Investimento> listaInvestRetorno = new TreeMap<Integer, Investimento>();
		Investimento investimento = null;
		try
		{
			statement = con.prepareStatement(query);
			ResultSet rs = statement.executeQuery();
			
			if(rs.next())
			{
				
				if ( rs.getString("tipo").equals( Constants.TIPO_INVESTIMENTO_ACAO ) )
				{
					investimento = new Acao();
				}
				else if ( rs.getString("tipo").equals( Constants.TIPO_INVESTIMENTO_POUPANCA ) )
				{
					investimento = new Poupanca();
				}
				else if ( rs.getString("tipo").equals( Constants.TIPO_INVESTIMENTO_FUNDO ) )
				{
					investimento = new Fundo();
				}
				else
					throw new RuntimeException("N�o foi poss�vel determinar o tipo do Investimento");
				
				
				investimento.setId(rs.getInt("id"));
				investimento.setSaldo(rs.getFloat("saldo"));
				investimento.setTaxaRendimento(rs.getFloat("taxaRendimento"));
				investimento.setDescricao(rs.getString("descricao"));
				investimento.setPersistido(true);
				
				listaInvestRetorno.put(investimento.getId(),investimento);
			}
		}
		catch(SQLException ex)
		{
			System.out.println(Constants.ERRO_REGISTRO_NAO_ENCONTRADO);
			System.out.println(ex);
		}
		return listaInvestRetorno;
	}
	 
	public Investimento procuraPorExemplo(Investimento model) 
	{
		query = "SELECT * FROM tbinvestimentos WHERE id = ?";
		Investimento investimento = null;
		try
		{
			statement = con.prepareStatement(query);
			statement.setInt(1, model.getId());
			ResultSet rs = statement.executeQuery();
			
			if(rs.next()){
				investimento = new Investimento();
				
				if ( rs.getString("tipo").equals( Constants.TIPO_INVESTIMENTO_ACAO ) )
				{
					investimento = new Acao();
				}
				else if ( rs.getString("tipo").equals( Constants.TIPO_INVESTIMENTO_POUPANCA ) )
				{
					investimento = new Poupanca();
				}
				else if ( rs.getString("tipo").equals( Constants.TIPO_INVESTIMENTO_FUNDO ) )
				{
					investimento = new Fundo();
				}
				else
					throw new RuntimeException("N�o foi poss�vel determinar o tipo do Investimento");
				
				
				investimento.setId(rs.getInt("id"));
				investimento.setSaldo(rs.getFloat("saldo"));
				investimento.setTaxaRendimento(rs.getFloat("taxaRendimento"));
				investimento.setDescricao(rs.getString("descricao"));
				investimento.setPersistido(true);
				
			}
		}
		catch(SQLException ex)
		{
			System.out.println(Constants.ERRO_REGISTRO_NAO_ENCONTRADO);
			System.out.println(ex);
		}
		return investimento;
	}
	 
}
 
